package com.itheima.reggie.web.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Dish;
import com.itheima.reggie.entity.dto.DishDto;
import com.itheima.reggie.entity.dto.PageQueryDto;
import com.itheima.reggie.service.DishService;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.swing.plaf.nimbus.NimbusLookAndFeel;
import java.util.Arrays;

/**
 * 菜品控制器
 */
@Slf4j
@RestController
@RequestMapping("/dish")
public class DishController {
    @Autowired
    private DishService dishService;

    /**
     * 新增菜品，并检查名称是否重复。
     *
     * @param dishDto 要新增的菜品
     * @return 是否新增成功
     */
    @PostMapping
    public R save(@RequestBody DishDto dishDto) {

        // 打印日志
        log.info("新增菜品，信息如下：[{}]", dishDto);

        // 校验参数，统一校验


        // 调用service保存
        boolean result = dishService.saveWithNameCheckAndSaveFlavors(dishDto);


        // 组织数并返回
        if (result) {
            return R.success("保存成功", null);
        }
        return R.fail("保存失败");

    }


    /**
     * 分页查询菜品，并关联查询菜品分类名称
     *
     * @param pageQueryDto 分页条件对象
     * @return
     */
    @GetMapping("/page")
    public R<Page<DishDto>> page(PageQueryDto pageQueryDto) {
        // 打印日志
        log.info("分页查询，信息如下：[{}]", pageQueryDto);

        // 校验参数

        // 调用service，分页查询
        Page<DishDto> page = dishService.page(pageQueryDto);

        // 组织数据并返回
        return R.success(page);
    }


    /**
     * 根据id查询菜品（含口味信息）
     *
     * @param id id
     * @return 含口味信息的菜品对象
     */
    @GetMapping("/{id}")
    public R<DishDto> getById(@PathVariable Long id) {
        // 记录日志
        log.info("查询id为：{}的菜品(含口味)", id);

        // 校验参数

        // 调用service查询
        DishDto dishDto = dishService.getWithFlavorsById(id);

        // 组织数据并返回

        return R.success("查询成功", dishDto);
    }


    /**
     * 修改菜品，包含修改菜品口味
     *
     * @param dishDto 新的含有口味的菜品对象
     * @return 是否修改成功
     */
    @PutMapping
    public R updateWithFlavors(@RequestBody DishDto dishDto) {

        // 记录日志
        log.info("修改菜品，菜品信息如下：{}", dishDto);


        // 校验参数


        // 调用service保存
        boolean result = dishService.updateWithFlavorsById(dishDto);


        // 组织数据并返回
        if (result) {
            return R.success("修改成功", null);
        }
        return R.fail("修改失败");
    }


    /**
     * 批量启售停售
     *
     * @param status    目标状态，0表示禁售 1表示起售
     * @param ids       要禁售/起售的菜品id
     * @return          是否成功
     */
    @PostMapping("/status/{status}")
    public R switchStatus(@PathVariable Integer status, Long[] ids) {
        // 记录日志
        String msg = status == 1 ? "批量启售" : "批量停售";
        log.info(msg + "，ids为：[{}]", Arrays.asList(ids));

        // 参数校验

        // 调用service批量启用/禁用
        boolean result = dishService.switchStatus(status, ids);

        // 组织数据并返回
        if (result) {
            return R.success(msg + "成功", null);
        }
        return R.fail(msg + "失败");
    }
}    